#ifndef BSP_UART_H
#define BSP_UART_H

#include <stdio.h>
#include "gpio.h"
#include "usart.h"
#include "stdbool.h"
#include "uart_config.h"
//#include "TypeDefine.h"

#define DEBUG_USART &huart1  //调试串口
#define UART_PORT_NUM   6  //STM32串口数量
#define UART_CONFIG_MAGIC  0x1234ABCD //串口配置校验码


typedef struct _Uart_TypeDef
{
	UART_HandleTypeDef *pst_huart;       //STM32串口
	uint8_t uartIdx;  // 加一个字段来保存自己在 ForwardServer 中的索引
  UartConfig_TypeDef config;          //串口参数配置
	GPIO_TypeDef       *pst_DEPort;      //RS485 DE端口
	uint32_t            ul_DEPin;        //RS485 DE引脚
	volatile bool IsTxBusy;              //DMA忙

	  void (*TxCplCallback)(struct _Uart_TypeDef *pst_UartStruct);                     /*接收完成回调函数*/
    void (*RxCplCallback)(struct _Uart_TypeDef *pst_UartStruct, uint16_t uin_Size);  /*接收完成回调函数*/
    void (*ErrorCallback)(struct _Uart_TypeDef *pst_UartStruct);                     /*错误回调函数*/
}Uart_TypeDef;


extern Uart_TypeDef gst_Uart1;
extern Uart_TypeDef gst_Uart2;
extern Uart_TypeDef gst_Uart3;
extern Uart_TypeDef gst_Uart4;
extern Uart_TypeDef gst_Uart5;
extern Uart_TypeDef gst_Uart6;



#ifdef __cplusplus
extern "C" {
#endif

uint8_t STM32UartTransmit(Uart_TypeDef *pst_UartStruct, uint8_t *puch_Data, uint16_t uin_Size);
uint8_t STM32UartReceive(Uart_TypeDef *pst_UartStruct, uint8_t *puch_Data, uint16_t uin_MaxSize);
uint8_t STM32UartBaudRate(Uart_TypeDef *pst_UartStruct, uint32_t ul_BaudRate);
uint8_t STM32UartSetConfig(Uart_TypeDef *pst_UartStruct);
void STM32UartTxClpCallBack(Uart_TypeDef *pst_UartStruct);
void STM32UartRxClpCallBack(Uart_TypeDef *pst_UartStruct);
void Wait_Tx_Complete(void); 
	
#ifdef __cplusplus
}
#endif

#endif

